// 题目描述
// 讨论 (2K)
// 102. 二叉树的层序遍历
// 中等
// 1.8K
// 给你二叉树的根节点 root ，返回其节点值的 层序遍历 。 （即逐层地，从左到右访问所有节点）。
//   示例 1：
// 输入：root = [3,9,20,null,null,15,7]
// 输出：[[3],[9,20],[15,7]]
// 示例 2：
// 输入：root = [1]
// 输出：[[1]]
// 示例 3：
// 输入：root = []
// 输出：[]
//   提示：
// 树中节点数目在范围 [0, 2000] 内
// -1000 <= Node.val <= 1000
// 通过次数
// 855.6K
// 提交次数
// 1.3M
// 通过率
// 65.8%
// https://leetcode.cn/problems/binary-tree-level-order-traversal/

function TreeNode(val, left, right) {
  this.val = (val === undefined ? 0 : val)
  this.left = (left === undefined ? null : left)
  this.right = (right === undefined ? null : right)
}

/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function (root) {
  if (!root) {
    return []
  }

  const res = []
  const queue = [root]
  while (queue.length) {
    // 技巧，通过内嵌 for 循环实现层次之间的逻辑分离
    const len = queue.length
    const arr = []
    for (let i = 0; i < len; i++) {
      const node = queue.shift()
      arr.push(node?.val || null)
      if (node && node.left) {
        queue.push(node.left)
      }
      if (node && node.right) {
        queue.push(node.right)
      }
    }
    res.push(arr)
  }

  return res
}

console.log(
  levelOrder(new TreeNode(
    3,
    new TreeNode(9),
    new TreeNode(20, new TreeNode(15), new TreeNode(7))
  ))
)
